package main

/*
  封装
*/

import (
	"net/rpc"
	"net/rpc/jsonrpc"
)

// go run encapsulation.go server.go
// 服务端在注册rpc对象时，能在编译期检测出 注册对象是否合法

// MyInterface 创建接口，在接口中定义方法原型
type MyInterface interface {
	HelloWorld(string, *string) error
}

// RegisterService 调用方法时，需要给i传参，参数应该是实现了HelloWorld方法的类
func RegisterService(i MyInterface) {
	rpc.RegisterName("server_name", i)
}

// MyClient 像调用本地函数一样，调用远程函数
type MyClient struct {
	cli *rpc.Client
}

// InitClient 由于使用了cli调用Call，因此需要初始化cli
func InitClient(addr string) MyClient {
	conn, _ := jsonrpc.Dial("tcp", addr) //用json序列化方式
	return MyClient{cli: conn}           //返回结构体对象
}

func (client *MyClient) HelloWorld(name string, resp *string) error {
	//参数1。 参照上面的Interface，RegisterName而来 a: 传入参数 b: 传出参数
	return client.cli.Call("server_name.HelloWorld", name, resp)
}
